package com.faithbj.process.stats;

import com.faithbj.process.State;
import com.faithbj.support.fp.Tuple3;
import com.faithbj.support.fp.Tuple4;
import com.faithbj.support.fp.Tuple6;

import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * JBPM模块提供给统计模块的接口.
 * User: xiongyuanwei
 * Date: 12-6-17
 * Time: 下午5:18
 */
public interface JbpmStatsService {

    /**
     * 1.请求参数：申请ID列表；响应参数：每个申请的当前状态、首核责任人、受理日期、街镇审核日期、导入内网日期、状态的起始日期.
     * @param applyIds 申请ID列表
     * @return Map(申请ID, 元组). 元组定义: (申请状态, 首核责任人名字, 受理日期, 街镇审核日期, 导入内网日期, 状态的起始日期)
     */
    Map<String, Tuple6<State, String, Date, Date, Date, Date>> getApplyDetailsByApplyIds(List<String> applyIds);

    /**
     * 2.请求参数：regionId区域ID、操作时间区间；响应参数：本区域内各个状态下的数目.
     * @param regionId 区域ID. 有可能是市级的，也有可能是区县的，也有可能是街镇的
     * @param from 操作时间区间下限
     * @param to 操作时间区间上限
     * @return Map(区域ID, Map(状态, 数目))
     */
    Map<String, Map<State, Long>> countGroupByApplyStateInRegion(String regionId, Date from, Date to);

    /**
     * 3.请求参数：regionId区域Id（有可能是区县的也有可能是街镇的，如果是区县的，返回里要有街镇ID）、
     * 操作时间区间；响应参数：出具报告总数；只超收入报告数据；只超财产报告数；收入和财产均超报告数.
     * @param regionId 区域ID
     * @param from 操作时间区间下限
     * @param to 操作时间区间上限
     * @return Map(区域ID, 元组). 元组定义: (出具报告总数, 只超收入报告数据, 只超财产报告数, 收入和财产均超报告数)
     */
    Map<String, Tuple4<Long, Long, Long, Long>> countReportsGroupByStreetInRegion(String regionId, Date from, Date to);

    /**
     * 4.请求参数：中止核对操作日期区间、regionId区域ID；响应参数：中止原因列表（包括中止原因及中止家庭户数）.
     * @param regionId 区域ID
     * @param from 中止核对操作日期区间下限
     * @param to 中止核对操作日期区间上限
     * @return Map(中止原因, 对应的家庭户数)
     */
    Map<PauseReason, Long> getPauseReasonDetailsInRegion(String regionId, Date from, Date to);

    /**
     * 5.请求参数：终止核对操作日期区间、regionId区域ID；响应参数：终止原因列表（包括终止原因及终止家庭户数).
     * @param regionId 区域ID
     * @param from 终止核对操作日期区间下限
     * @param to 终止核对操作日期区间上限
     * @return Map(终止原因, 对应的家庭户数)
     */
    Map<TerminateReason, Long> getTerminateReasonDetailsInRegion(String regionId, Date from, Date to);

    /**
     * 6.请求参数：操作截止时间区间；返回操作截止时间在请求时间区间内的所有操作人在
     * （准入标准审核、比对审核、抽查）三个状态结点的状态开始时间、状态截止时间、实际操作时间），
     * 如果实际还未操作，则返回当前时间或者返回为空。注：只返回状态截止时间早于实际操作时间，即已经超时的数据.
     * @param from 操作截止时间区间下限
     * @param to 操作截止时间区间上限
     * @return Map(操作人名字, Map(状态, 元组列表)). 状态为标准审核、比对审核、抽查三个状态. 元组定义: (开始时间, 截止时间, 操作时间)
     */
    Map<String, Map<State, List<Tuple3<Date, Date, Date>>>> getTimingDetailsInVerifyPhaseDeadlineDuring(Date from, Date to);

    /**
     * 请求参数：操作截止时间区间，regionId区域ID；返回操作截止时间在请求时间区间内的每个regionId在
     * （信息录入、信息核实）两个状态结点的状态开始时间、状态截止时间、实际操作时间），如果实际还未操作，
     * 则返回当前时间或者返回为空.注：只返回状态截止时间早于实际操作时间，即已经超时的数据.
     * @param regionId 区域ID
     * @param from 操作截止时间区间下限
     * @param to 操作截止时间区间上限
     * @return Map(区域ID, Map(状态, 元组列表)). 状态为信息录入、信息核实两个状态. 元组定义: (开始时间, 截止时间, 操作时间)
     */
    Map<String, Map<State, List<Tuple3<Date, Date, Date>>>> getTimingDetailsInInputPhaseDeadlineDuring(String regionId, Date from, Date to);

    /**
     * 请求参数：审核状态，受理时间区间。响应参数：申请编号列表。
     * @param stateId 状态标识符
     * @param from 受理时间区间下限
     * @param to 受理时间区间上限
     * @return 申请编号列表
     */
    List<String> getApplyIdsByStateDuring(int stateId, Date from, Date to);
}
